package com.kzn.util.tmp;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.ArrayList;

/**
 * @author sorclown
 * @date 2022/2/6
 */
public class RemoveDuplicatePicture {

    /**
     * 相似图片去重
     * 核心功能已完成
     * 待改进
     *
     * @无法适应所有尺寸图片 标记一
     * @相似度目前还是手写的_count属性暂时还没用上 标记二
     */
    public static void main(String[] args) {
        ArrayList list = new ArrayList();  /**等待改进 标记一*/
        list.add("10,10");
        list.add("20,10");
        list.add("30,10");
        list.add("40,10");
        list.add("50,10");
        int count = 0; /**定义相似度  由于应用场景的不同  本地图片的像素点渲染 可能出现不同  因此需要设置一个相似度  此处数值应小于 list的长度  0为完全一样*/
        if (list.size() < count) {
            System.out.println("相似度参数设置不符合规格");
        }
        doImageremoval("C:\\my\\temp\\Screenshots", list, list.size() - count);
    }

    /**
     * 去重方法
     */
    public static void doImageremoval(String FilePath, ArrayList RgbList, int count) {
        ArrayList<File> list = new ArrayList<>();
        readImgByFormat(FilePath, "png", list); /**数组中存入所有指定格式的图片文件*/
        for (int i = 0; i < list.size(); i++) {
            /**遍历图片文件*/
            /**遍历文件夹 list作为需要进行匹配的样本图*/
            System.out.println("读取文件" + list.get(i).getName());
            String ints1 = "";
            /**获取指定像素坐标*/
            ArrayList getRgblist = new ArrayList();
            for (int j = 0; j < RgbList.size(); j++) {
                String[] split = RgbList.get(j).toString().split(",");
                int x = Integer.parseInt(split[0]);
                int y = Integer.parseInt(split[1]);  /**获取需要获取像素数值的坐标*/
                ints1 = readRGB(list.get(i), x, y);  /**得到结果*/
                getRgblist.add(ints1);
            }/**得到样本图RGBList*/
/**读取匹配图*/
            for (int k = 0; k < list.size(); k++) {
                ArrayList rootList = new ArrayList();
                rootList.addAll(getRgblist);
                ArrayList getRgblist2 = new ArrayList();
                String ints2 = "";
                for (int j = 0; j < RgbList.size(); j++) {
                    String[] split2 = RgbList.get(j).toString().split(",");
                    int x = Integer.parseInt(split2[0]);
                    int y = Integer.parseInt(split2[1]);  /**获取需要获取像素数值的坐标*/
                    ints2 = readRGB(list.get(k), x, y);  /**得到结果*/
                    getRgblist2.add(ints2);
                }/**得到匹配图RGBL*/
                rootList.removeAll(getRgblist2);
                if (rootList.size() < 2 && !list.get(i).getName().equals(list.get(k).getName()))/**罗列的像素点特征匹配 并且样本图与匹配图 不是同一个文件*/ {/**标记二*/
                    System.out.println("删除文件" + list.get(k).getName());
                    list.get(k).delete();
                }
            }
            readImgByFormat(FilePath, "png", list); /**数组中存入所有指定格式的图片文件  刷新文件夹*/
        }
    }

    /**
     * 读取文件夹内的所有图片
     */
    public static void readImgByFormat(String FilePath, String ForMat, ArrayList FileList) {
        FileList.removeAll(FileList);  /**清空*/
        File file = new File(FilePath); /**读取文件夹*/
        File[] files = file.listFiles(); /**获取文件夹内的所有内容*/
        for (int i = 0; i < files.length; i++) {
            boolean equals = files[i].getName().contains("." + ForMat.toLowerCase()) || files[i].getName().contains("." + ForMat.toUpperCase());/**是否包含指定的后缀*/
            if (equals) {
                FileList.add(files[i]);
            }/**符合索引条件  加入集合*/
        }
        System.out.println("本次索引 得到结果个数--" + FileList.size());
    }

    /**
     * --------------读取图片RGB  返回单个像素点的RGB值
     *
     * @param imagefile 读取文件
     * @param x         横坐标
     * @param y         纵坐标
     */
    public static String readRGB(File imagefile, int x, int y) {
        int[] rgb = new int[3];
        BufferedImage bi = null;
        try {
            bi = ImageIO.read(imagefile);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
        }
        int pixel = bi.getRGB(x, y); // 下面三行代码将一个数字转换为RGB数字
        rgb[0] = (pixel & 0xff0000) >> 16;
        rgb[1] = (pixel & 0xff00) >> 8;
        rgb[2] = (pixel & 0xff);
        return rgb[0] + "," + rgb[1] + "," + rgb[2];
    }
}



